home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1987-04-12 | 9.0 KB | 327 lines |
- 5 PRINT "Some people are Weatherwise, most people are otherwise."
- 10 REM ALMANAC FOR A WEATHER PERSON
- 20 REM WRITTEN BY ALFRED K. BLACKADAR
- 30 REM ROOM 503 WALKER BLDG
- 40 REM UNIVERSITY PARK, PA 16802
- 50 REM
- 60 READ LO,LA
- 70 REM SUBSTITUTE YOUR OWN LONGITUDE AND LATITUDE
- 80 REM IN STEP 100. USE DECIMAL DEGREES.
- 90 REM EAST LONGITUDES ARE NEGATIVE, WEST POSITIVE
- 100 DATA 90.1833,38.633
- 110 READ PI,OB,L0,L1,A0,A1,E,EO
- 120 DATA 3.141592654,.409095,4.88376619,.017202791
- 130 DATA 6.23471229,.017201970,.016728,.00218
- 140 TR=PI/180 : FC=2*PI
- 150 SL=15*INT(LO/15+0.5) : REM STANDARD LONGITUDE
- 160 REM TO SHIFT ONE TIME ZONE WEST, INSERT STEP
- 170 REM "175 SL=SL+15"; "-" IN LIEU OF "+" IF EAST
- 180 TZ=SL/15-4 : REM SELECTS ZONE-TIME LABEL
- 190 LO=LO*TR : LA=LA*TR : SL=SL*TR
- 200 REM D STRINGS ARE GROUPS OF 9 CHARS * SPACES
- 210 D1$="SUNDAY MONDAY TUESDAY WEDNESDAY"
- 220 D2$="THURSDAY FRIDAY SATURDAY "
- 230 D$=D1$+D2$ : X$=" ** "
- 240 M$="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
- 250 Z$="ASTESTCSTMSTPSTYSTASTADTEDTCDTMDTPDTYDTADT"
- 260 TN=LO/FC+0.5 : REM LONGITUDE TIME OFFSET + 12 HR
- 270 PRINT "DAY"; : INPUT D
- 280 PRINT "MONTH (#)"; : INPUT M
- 290 IF M>12 THEN PRINT "INVALID DATE" : GOTO 280
- 300 PRINT "YEAR"; : INPUT YR
- 310 X=1 : Y=1 : GOSUB 2410
- 320 T9=T : REM TIME MARK FOR 1ST DAY OF YEAR
- 330 X=D : Y=M : GOSUB 2410
- 340 YD=T-T9+1 : REM DAY OF YEAR
- 350 X=INT(T+1)/7 : Y=INT(X)
- 360 WD=INT(7*(X-Y)+0.5) : REM DAY OF THE WEEK
- 370 REM NEXT T IS DAYS AFTER 0HR GMT 1/1/1980
- 380 T=T+3449.5+TN
- 385 DT=0.000589999+2E-08*T : T=T+DT
- 390 CLS
- 400 PRINT TAB(15);"ALMANAC - SAINT LOUIS, MISSOURI ";
- 410 PRINT MID$(D$,9*WD+1,9);
- 420 PRINT D;MID$(M$,3*(M-1)+1,3);YR
- 430 PRINT TAB(20);"Day of Year";YD;" Julian Day";INT(JD+1)
- 440 PRINT TAB(38);"SUN"
- 450 REM MAKE SUMMER TIME SHIFT AS NEEDED
- 460 REM IF NO SUMMER TIME, OMIT STEP 500.
- 470 REM TO ALTER DATES OF SHIFT, ADD (ALGBR'LY)
- 480 REM REQ'D # OF DAYS TO "113" AND "298"
- 490 X=YD-WD : S2=SL-15*TR
- 500 IF X>113 THEN IF X<298 THEN TZ=TZ+7 : SL=S2
- 510 T$=MID$(Z$,3*TZ+1,3)
- 610 GOSUB 2860 : REM FIND SUN AT LOCAL NOON
- 620 IF DE>PI THEN DE=DE-FC
- 630 Q=ML-RA : REM EQ OF TIME (NOT DISPLAYED)
- 660 PRINT TAB(15);"Declination";INT(DE*100/TR+0.5)/100;" deg.";
- 670 PRINT " Distance";RV;" A.U.": PRINT TAB(17);"Rises";
- 680 X=-0.014539 : GOSUB 2360
- 690 IF ABS(Y)<1 THEN 720
- 700 PRINT X$;X$;T$;" Sets";X$;X$;T$
- 710 GOTO 780
- 720 S0=Z*(1+L1/FC) :H=-S0 : GOSUB 2260
- 724 TC=0.00274*S0*SIN(OB)*COS(TL)*SIN(LA)
- 725 Z=SIN(S0)*COS(LA)*(COS(DE)^3)
- 726 TC=TC/Z
- 730 X=ZT+TC+EO : GOSUB 2310
- 740 PRINT X;Y;T$;" Sets";
- 750 H=S0 : GOSUB 2260
- 760 X=ZT+TC+EO : GOSUB 2310
- 770 PRINT X;Y;T$
- 780 PRINT TAB(27);"Transits Meridian";
- 790 IF ABS(LA-DE)>PI/2 THEN PRINT X$;X$;T$ : GOTO 830
- 800 H=0 : GOSUB 2260
- 810 X=ZT : GOSUB 2310
- 820 PRINT X;Y;Z;T$
- 830 GOSUB 3000
- 850 REM OPTIONAL MOONRISE/SET MODULE
- 860 PRINT TAB(37);"MOON" : PRINT TAB(17);"Rises";
- 870 A=-1 : ZT=PI : GOSUB 2710
- 880 X=ZT+EO : GOSUB 2310
- 890 IF A<>1000 THEN 910
- 900 PRINT X$;X$;T$ : GOTO 920
- 910 PRINT X;Y;T$;
- 920 PRINT " Sets";
- 930 A=1 : ZT=PI : GOSUB 2710
- 940 X=ZT+EO : GOSUB 2310
- 950 IF A<>1000 THEN 970
- 960 PRINT X$;X$;T$ : GOTO 980
- 970 PRINT X;Y;T$
- 980 PRINT TAB(27);"Transits Meridian";
- 990 A=0 : ZT=PI : GOSUB 2710
- 1000 X=ZT+EO : GOSUB 2310
- 1010 IF A<>1000 THEN 1030
- 1020 PRINT X$;X$;T$ : GOTO 1040
- 1030 PRINT X;Y;T$
- 1040 Z=T : GOSUB 2510
- 1050 X=PI-(X0-TL) : PH=INT(50*(1+COS(X)))/100
- 1060 PRINT TAB(24);"Phase";PH;"(Full = 1, New = 0)"
- 1070 X=SIN(D0) : Y=COS(D0) : GOSUB 2010
- 1080 A=INT(Z*2953.06/FC)/100
- 1090 PRINT TAB(21);"Age of Mean Moon (for clocks):";A;"DAYS"
- 1100 REM END OF MOON MODULE
- 1530 PRINT TAB(8);"PRESS ANY KEY TO CONTINUE ";
- 1540 A$=INKEY$ : IF A$="" THEN 1540
- 1990 GOTO 4000
- 1995 IF A$ <> "YES" THEN END ELSE RUN
- 2000 REM SUBR Z=ARCTAN(X/Y)
- 2001 REM 0<= Z < 2*PI
- 2010 C=0 : N=0
- 2015 PI=3.14159
- 2020 IF Y<>0 THEN 2050
- 2030 Z=0 : C=1
- 2035 IF X<0 THEN N=1
- 2040 GOTO 2060
- 2050 Z=X/Y
- 2060 Z=ATN(Z)
- 2070 IF C=1 THEN Z=PI/2-Z
- 2080 IF N=1 THEN Z=-Z
- 2090 IF Y<0 THEN Z=Z+PI
- 2100 IF Z<0 THEN Z=Z+2*PI
- 2110 RETURN
- 2150 REM ZENITH ANGLE ZA AND AZIMUTH AZ FROM H AND DE
- 2160 CZ=SIN(LA)*SIN(DE)+COS(LA)*COS(DE)*COS(H)
- 2165 SZ=SQR(1-CZ^2): ZA=ATN(SZ/CZ)
- 2170 IF ZA<0 THEN ZA=ZA+PI
- 2175 X=COS(DE)*SIN(H)/SZ
- 2180 Y=(SIN(LA)*CZ-SIN(DE))/(SZ*COS(LA))
- 2185 GOSUB 2010
- 2190 AZ=Z : IF AZ>PI THEN AZ=AZ-FC
- 2195 RETURN
- 2200 REM H=LHA FROM RADIAN ZONE TIME ZT AND RA
- 2210 H=ZT+SL-RA-LO+ML+PI
- 2220 IF H>PI THEN H=H-FC
- 2230 RETURN
- 2245 PX=3423+187*COS(M1)+34+COS(M1-2*D0)+28*COS(2*D0)
- 2250 REM RADIAN ZONE TIME ZT FROM H=LHA, RA
- 2260 FOR IJ=1 TO 5
- 2265 ZT=H+RA+LO-SL-ML-PI
- 2270 X=SIN(ZT) : Y=COS(ZT) : GOSUB 2010
- 2275 ML=L0+L1*(T-TN+(SL+Z)/FC) : NEXT IJ
- 2280 ZT=Z : RETURN
- 2300 REM CONVERT ANGULAR TIME X
- 2301 REM TO X=HR, Y=MIN, Z=SEC
- 2310 W=X*24/FC : X=INT(W)
- 2320 Z=(W-X)*60 : Y=INT(Z)
- 2330 Z=INT((Z-Y)*60) : RETURN
- 2350 REM Z=LHA FROM X=COS(ZENITH ANGLE)
- 2360 Y=(X-SIN(LA)*SIN(DE))/(COS(LA)*COS(DE))
- 2370 IF ABS(Y)>1 THEN 2390
- 2380 X=SQR(1-Y^2) : GOSUB 2010
- 2390 RETURN
- 2400 REM JULIAN DAY (JD) FROM DATE
- 2401 REM X=DAY, Y=MONTH, YR=YEAR
- 2410 T=367*(YR-1980)
- 2420 T=T-INT(7*(YR+INT((Y+9)/12))/4)
- 2430 S=SGN(Y-9) : A=ABS(Y-9)
- 2440 Z=INT((YR+S*INT(A/7))/100)
- 2450 T=T-INT(3*(Z+1)/4)
- 2460 T=T+INT(275*Y/9)+X-0.5
- 2470 JD=T+2.44769E+06
- 2480 RETURN
- 2500 REM FIND RIGHT ASCENSION RA AND DECLINATION
- 2501 REM DE OF MOON GIVEN THE TIME Z
- 2510 M1=1.54736+0.228027*Z : REM MEAN ANOMALY
- 2520 A3=A0+A1*Z : REM SUN'S MEAN ANOMALY
- 2530 M3=1.36401+0.229972*Z
- 2540 D0=2.76343+0.212769*Z
- 2550 F0=4.99608+0.230896*Z
- 2560 X=109760*SIN(M1)-22236*SIN(M1-2*D0)
- 2570 X=109760*SIN(M1)-22236*SIN(M1-2*D0)
- 2571 X=X-11490*SIN(2*D0)+3728*SIN(2*M1)
- 2572 X=X-3232*SIN(A3)-1996*SIN(2*F0)
- 2590 X0=M3+9.99E-07*X : REM MOON'S TRUE LONGITUDE
- 2600 X=89503*SIN(F0)+4897*SIN(M1+F0)
- 2601 X=X+4847*SIN(M1-F0)-3023*SIN(F0-2*D0)
- 2610 X=X+4847*SIN(M1-F0)-3023*SIN(F0-2*D0)
- 2620 X=COS(Y2)*SIN(X0)*COS(OB)-SIN(Y2)*SIN(OB)
- 2630 Y=COS(Y2)*COS(X0) : GOSUB 2010
- 2640 RA=Z
- 2650 X=COS(Y2)*SIN(X0)*SIN(OB)+SIN(Y2)*COS(OB)
- 2660 Y=COS(Y2)*COS(X0)/COS(RA)
- 2670 GOSUB 2010
- 2680 DE=Z : IF Z > PI THEN DE=DE-FC
- 2690 RETURN
- 2700 REM FIND ZONE TIME OF LUNAR EVENT
- 2701 REM A = -1, +1, 0 => RISE, SET, TRANSIT
- 2702 REM ZT IS VALUE BEING REFINED
- 2710 FOR I= 1 TO 5
- 2720 Z0=ZT : Z=T-TN+(SL+ZT)/FC
- 2730 GOSUB 2510 : REM GET MOON'S POSITION
- 2735 IF ABS(LA-DE)>PI/2 THEN 2820
- 2740 IF A=0 THEN 2770
- 2745 PX=3423+187*COS(M1)+34+COS(M1-2*D0)+28*COS(2*D0)
- 2750 X=0.0118*PX/3423-0.00989 : GOSUB 2360
- 2755 IF ABS(Y)>1 THEN 2820
- 2760 GOSUB 2010
- 2770 H=A*Z : REM LOCAL HOUR ANGLE OF EVENT
- 2780 GOSUB 2260 : REM GET EVENT ZONE TIME
- 2790 IF ABS(ZT-Z0)<9.9999E-05 THEN 2830
- 2800 ZT=Z0+1.035*(ZT-Z0) : REM NEW GUESS
- 2805 IF ZT<0 THEN ZT=ZT+FC: GOTO 2805
- 2810 NEXT I
- 2820 A=1000 : REM SIGNAL NO EVENT FOUND
- 2830 RETURN
- 2850 REM SUN'S RA, DECL, AND RADIUS VECTOR
- 2860 MA=A0+A1*T : REM MEAN ANOMALY
- 2870 ML=L0+L1*T : REM MEAN CELESTIAL LONGITUDE
- 2880 X=SIN(ML) : Y=COS(ML) : GOSUB 2010
- 2890 ML=Z : REM 0<=ML<2*PI
- 2900 DL=2*E*SIN(MA)+1.25*E^2*SIN(2*MA)
- 2910 TA=MA+DL : TL=ML+DL : REM TRUE ANOM & LONG
- 2920 RV=(1-E^2)/(1-E*COS(TA)) : REM RADIUS VECTOR
- 2930 X=SIN(TL)*SIN(OB) : Y=SQR(1-X^2) : GOSUB 2010
- 2940 DE=Z : IF Z>PI THEN Z=Z-FC
- 2950 X=SIN(TL)*COS(OB) : Y=COS(TL) : GOSUB 2010
- 2960 RA=Z : REM SUN'S RIGHT ASCENSION
- 2970 RETURN
- 3000 REM SUBROUTINE TO DISPLAY START
- 3001 REM AND END OF TWILIGHT.
- 3010 PRINT TAB(14);"Civil Twilight";
- 3015 PRINT " Begins";
- 3020 X=-0.10453 : GOSUB 2360 : REM CIVIL
- 3030 IF ABS(Y)<1 THEN 3060
- 3040 PRINT X$;X$;T$;" Ends";X$;X$;T$
- 3050 GOTO 3140
- 3060 S0=Z : H=-S0 : GOSUB 2260
- 3070 TC=0.00274*S0*SIN(OB)*COS(TL)*SIN(LA)
- 3075 Z=SIN(S0)*COS(LA)*(COS(DE)^3)
- 3080 TC=TC/Z
- 3090 X=ZT+TC+EO : GOSUB 2310
- 3100 PRINT X;Y;T$;" Ends";
- 3110 H=S0 : GOSUB 2260
- 3120 X=ZT+TC+EO : GOSUB 2310
- 3130 PRINT X;Y;T$
- 3140 RETURN
- 3150 REM CARTESIAN XS, YS, ZS FROM SPHERICAL R, B, L
- 3160 XS=R*COS(B)*COS(L)
- 3170 YS=R*COS(B)*SIN(L)
- 3180 ZS=R*SIN(B)
- 3190 RETURN
- 3200 REM SPHER. R, B, L FROM CARTESIAN XS, YS, ZS
- 3210 R=SQR(XS^2+YS^2+ZS^2)
- 3220 X=ZS/R : Y=SQR(1-X^2) : B=ATN(X/Y)
- 3230 X=YS : Y=XS : GOSUB 2010 : L=Z
- 3240 RETURN
- 3250 REM ROTATE X-Y PLANE THROUGH ANGLE THETA.
- 3260 XP=X : YP=Y
- 3270 X=XP*COS(THETA)+YP*SIN(THETA)
- 3280 Y=YP*COS(THETA)-XP*SIN(THETA)
- 3290 RETURN
- 4000 INPUT "HOUR, MINUTE"; HR,MIN
- 4010 ZTH=HR+MIN/60 :ZT=ZTH*FC/24
- 4020 T=T-TN+(ZT+SL)/FC
- 4030 PRINT TAB(30);"DATA FOR";HR;MIN;T$
- 4040 PRINT TAB(5);"OBJECT";TAB(20);"ALTITUDE";
- 4050 PRINT TAB(35);"AZIMUTH";TAB(50);"DISTANCE";
- 4051 PRINT TAB(65);"ST. MAG."
- 4060 GOSUB 2860
- 4070 GOSUB 2210
- 4080 GOSUB 2150
- 4090 AL=PI/2-ZA
- 4110 PRINT TAB(5);"Sun";TAB(19);AL/TR;TAB(34);
- 4120 PRINT AZ/TR;TAB(49);RV
- 4130 Z=T: GOSUB 2500
- 4140 GOSUB 2200
- 4150 GOSUB 2150
- 4160 PX=3423+187*COS(M1)+34*COS(M1-2*D0)+28*COS(2*D0)
- 4170 RVM=8.794/PX
- 4180 PX=PX*SIN(ZA)/206265
- 4190 AL=PI/2-ZA-PX
- 4200 PRINT TAB(5);"Moon";TAB(19);AL/TR;TAB(34);AZ/TR;
- 4210 PRINT TAB(49);RVM
- 4300 REM ADD PLANET POSITIONS TO TABLE.
- 4310 DATA 2.7619, .071425, .2056, .8421, .1222
- 4320 DATA .3871, .5079, 0.99, "Mercury"
- 4330 DATA 3.9452, .027962, .0068, 1.3372, .0592
- 4340 DATA .7233, .9574, -2.45, "Venus"
- 4350 DATA 2.6379, .009146, .0934, .8640, .0323
- 4360 DATA 1.5237, 4.9992, -.61, "Mars"
- 4370 DATA 2.3245, .001450, .0484, 1.7519, .0228
- 4380 DATA 5.2028, 4.7793, -8.25, "Jupiter"
- 4390 DATA 1.2624, .000584, .0556, 1.9826, .0434
- 4400 DATA 9.5388, 5.9222, -8.45, "Saturn"
- 4410 REM MAIN LOOP
- 4420 FOR I=1 TO 5
- 4430 READ MA,MDOT,EC,AN,INC,AX,OM,MAG,P$
- 4440 MA=MA+MDOT*T : REM MEAN ANOMALY
- 4450 REM LOOP TO SOLVE KEPPLER'S EQUATION
- 4460 KETRY=MA
- 4465 Z=ABS(MA)/1E+06:IF Z<9.99E-07 THEN Z=9.99E-07
- 4470 KE=MA+EC*SIN(KETRY)
- 4480 IF ABS(KE-KETRY)<Z THEN 4500
- 4490 KETRY=KE : GOTO 4470
- 4500 RP=AX*(1-EC*COS(KE)) : REM DIST FROM SUN
- 4510 Y=(AX*(1-EC^2)/RP-1)/EC
- 4520 X=SQR(1-Y^2)
- 4530 IF SIN(KE)<0 THEN X=-X
- 4540 GOSUB 2010
- 4550 NU=Z : REM TRUE ANOMALY
- 4560 AL=NU+OM : REM ARGUMENT OF LATITUDE
- 4570 R=RP : L=AL : B=0 : GOSUB 3150
- 4580 X=YS : Y=ZS : THETA=-INC : GOSUB 3250
- 4590 YS=X : ZS=Y
- 4600 X=XS : Y=YS : THETA=-AN : GOSUB 3250
- 4610 XH=X : YH=Y : ZH=ZS : REM HELIO. ECLIPTIC
- 4620 R=RV : L=TL : B=0 : GOSUB 3150
- 4630 XS=XH+XS : YS=YH+YS : ZS=ZH : REM GEOCENTRIC
- 4640 X=YS : Y=ZS : THETA=-OB : GOSUB 3250
- 4650 YS=X : ZS=Y : REM EQUATORIAL SYSTEM
- 4660 GOSUB 3200 : RA=L : DE=B
- 4670 GOSUB 2210
- 4680 GOSUB 2150
- 4690 AL=PI/2-ZA
- 4700 PH=(R^2+RP^2-RV^2)/(2*R*RP)
- 4710 MAG=MAG-1.0857*LOG((1+PH)/(RP^2*R^2))
- 4720 PRINT TAB(5);P$;TAB(19);AL/TR;TAB(34);AZ/TR;
- 4730 PRINT TAB(49);R;TAB(65);MAG
- 4740 NEXT I
- 4750 Z=T-INT(T)
- 4760 X=(Z+0.5)*FC+ML-LO+FC
- 4770 IF X>FC THEN X=X-FC: GOTO 4770
- 4780 GOSUB 2310
- 4790 PRINT TAB(26);"LOCAL SIDERIAL TIME:";
- 4791 PRINT INT(X);"h ";INT(Y);"m"
- 9000 END
-